/*
 * Project Name spring-boot-tools
 * File Name UploadFile
 * Package Name com.huxiaosu.tools.oss
 * Create Time 2024/7/2
 * Create by name：liujie
 */
package com.huxiaosu.tools.oss;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.dromara.x.file.storage.core.FileInfo;
import org.dromara.x.file.storage.core.FileStorageService;
import org.dromara.x.file.storage.core.ProgressListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.CacheControl;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayOutputStream;
import java.net.URLEncoder;

/**
 * Description
 *
 * @author liujie
 * @date 2024/7/2 14:32
 */
@Slf4j
@RestController
public class UploadFile {
    @Autowired
    private FileStorageService fileStorageService;
    /**
     * 上传文件
     */
    @PostMapping("/upload")
    public FileInfo upload(MultipartFile file) {
        return fileStorageService.of(file).upload();
    }

    @PostMapping("/upload2")
    public FileInfo upload2(MultipartFile file, @RequestParam("path") String path){
        String originalFilename = file.getOriginalFilename();
        return  this.fileStorageService.of(file).setPath(path).setSaveFilename(originalFilename).setProgressListener(new ProgressListener() {
            @Override
            public void start() {
                log.info("upload: 开始上传");
            }
            @Override
            public void progress(long l, Long l1) {
                log.info("upload: 已上传 " + l + " 总大小" + l1 + " " + (double)(l * 10000L / l1) * 0.01 + "%");
            }
            @Override
            public void finish() {
                log.info("upload: 上传完成");
            }
        }).upload();

    }

    @GetMapping("/remove")
    public boolean remove(@RequestParam("fileName") String fileName,@RequestParam("path") String path) {
        log.info("remove path = {} ,file = {}",path,fileName);
        FileInfo fileInfo = (new FileInfo()).setPath(path).setFilename(fileName);
        fileInfo.setPlatform("local-plus-1");
        return this.fileStorageService.delete(fileInfo);
    }

    @SneakyThrows(value = Throwable.class)
    @GetMapping("/download")
    public ResponseEntity<?> download(@RequestParam("fileName") String fileName,@RequestParam("path") String path) {
        FileInfo fileInfo = (new FileInfo()).setPath(path).setFilename(fileName);
        fileInfo.setPlatform("local-plus-1");
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\"");
        headers.add(HttpHeaders.CONTENT_TYPE, "application/octet-stream;charset=utf-8");
        headers.setCacheControl(CacheControl.noCache());
        fileStorageService.download(fileInfo).outputStream(out);
        return new ResponseEntity<>(out.toByteArray(), headers, HttpStatus.OK);
    }
    /**
     * 上传文件到指定存储平台，成功返回文件信息
     */
    @PostMapping("/upload-platform")
    public FileInfo uploadPlatform(MultipartFile file) {
        return fileStorageService.of(file)
                //使用指定的存储平台
                .setPlatform("aliyun-oss-1")
                .upload();
    }

    //// 直接上传
    //fileStorageService.of(file).upload();
    //
    //// 如果要用 byte[]、InputStream、URL、URI、String 等方式上传，暂时无法获取 originalFilename 属性，最好手动设置
    //fileStorageService.of(inputStream).setOriginalFilename("a.jpg").upload();
    //
    //// 上传到指定路径下
    //fileStorageService.of(file)
    //        .setPath("upload/") // 保存到相对路径下，为了方便管理，不需要可以不写
    //        .upload();
    //
    //// 关联文件参数并上传
    //fileStorageService.of(file)
    //        .setObjectId("0")   // 关联对象id，为了方便管理，不需要可以不写
    //        .setObjectType("0") // 关联对象类型，为了方便管理，不需要可以不写
    //        .putAttr("role","admin") //保存一些属性，可以在切面、保存上传记录、自定义存储平台等地方获取使用，不需要可以不写
    //        .putAttr("username","007")
    //        .upload();
    //
    //// 上传到指定的存储平台
    //fileStorageService.of(file)
    //        .setPlatform("aliyun-oss-1")    // 使用指定的存储平台
    //        .upload();
    //
    //// 对图片进行处理并上传，有多个重载方法。图片处理使用的是 https://github.com/coobird/thumbnailator
    //fileStorageService.of(file)
    //        .setThumbnailSuffix(".jpg") //指定缩略图后缀，必须是 thumbnailator 支持的图片格式，默认使用全局的
    //        .setSaveThFilename("thabc") //指定缩略图的保存文件名，注意此文件名不含后缀，默认自动生成
    //        .image(img -> img.size(1000,1000))  // 将图片大小调整到 1000*1000
    //        .thumbnail(th -> th.size(200,200))  // 再生成一张 200*200 的缩略图
    //        .upload();
    //
    //// 其它更多方法以实际 API 为准
}